package com.cheng.example.geektime.designpatterns.j46.v2;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/**
 * @author chengshuai
 * @version 1.0
 * @date 2020/6/10 11:39
 */


/**
 *
 * 使用set方法解决参数列表过长问题
 *
 * 新的问题：
 *
 * 1、如果set方法中的元素为必填项，这些不好校验
 * 2、配置项目有一定的依赖关系，这个不好搞，例如：设置其中一个参数就必须设置另外两个，配置项之间有一些约束条件
 * 3、不可变独享问题，就是这个对象创建后就不能在更改，只提供一个构造方法，而不提供set方法和public级别的属性
 *
 * 遇到这三种情况，这种set方法就不行了
 *
 *
 */
@Data
public class ResourcePoolConfig {
    private static final int DEFAULT_MAX_TOTAL = 8;
    private static final int DEFAULT_MAX_IDLE = 8;
    private static final int DEFAULT_MIN_IDLE = 0;

    private String name;
    private int maxTotal = DEFAULT_MAX_TOTAL;
    private int maxIdle = DEFAULT_MAX_IDLE;
    private int minIdle = DEFAULT_MIN_IDLE;

    public ResourcePoolConfig(String name) {
        if (StringUtils.isBlank(name)) {
            throw new IllegalArgumentException("name should not be empty.");
        }
        this.name = name;
    }

    public void setMaxTotal(int maxTotal) {
        if (maxTotal <= 0) {
            throw new IllegalArgumentException("maxTotal should be positive.");
        }
        this.maxTotal = maxTotal;
    }

    public void setMaxIdle(int maxIdle) {
        if (maxIdle < 0) {
            throw new IllegalArgumentException("maxIdle should not be negative.");
        }
        this.maxIdle = maxIdle;
    }

    public void setMinIdle(int minIdle) {
        if (minIdle < 0) {
            throw new IllegalArgumentException("minIdle should not be negative.");
        }
        this.minIdle = minIdle;
    }
    //...省略getter方法...

    public static void main(String[] args) {
        // ResourcePoolConfig使用举例
        ResourcePoolConfig config = new ResourcePoolConfig("dbconnectionpool");
        config.setMaxTotal(16);
        config.setMaxIdle(8);
    }
}